package cn.lsc.service.impl;

import cn.lsc.courseconstants.CourseConstants;
import cn.lsc.domain.CourseType;
import cn.lsc.dto.CourseTypeDto;
import cn.lsc.dto.CrumbsDto;
import cn.lsc.enums.GlobaEnums;
import cn.lsc.mapper.CourseTypeMapper;
import cn.lsc.service.ICourseTypeService;
import cn.lsc.util.AssertUtil;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author lsc
 * @since 2022-09-02
 */
@Service
@Slf4j
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Override
    @Cacheable(cacheNames = CourseConstants.COURSE_TYPE_TREE, key = "'tree'")
    public List<CourseType> treeData() {
        // 1.查询所有数据

        // 1.查询缓存看数据是否存在
        /*Object redisCourseTypeTree = redisTemplate.opsForValue().get(CourseConstants.COURSE_TYPE_TREE);
        if(redisCourseTypeTree!=null){
            log.info("从缓存中查询课程分类树！");
            // 不等于null，说明缓存中存在课程分类，那么直接返回即可
            return (List<CourseType>) redisCourseTypeTree;
        }else {
            log.info("从数据库中查询课程分类树！");
            return tree();

        }*/
        return tree();


    }

    @Override
    public void patchDel(List<Long> ids) {
        courseTypeMapper.patchDel(ids);
    }

    @Override
    public void updateTotalCountById(Long courseTypeId) {

    }


    private ArrayList<CourseType> tree() {
        // 1.查询所有数据
        List<CourseType> courseTypes = selectList(null);
        // 2.转换集合为map
        Map<Long, CourseType> collect = courseTypes.stream().collect(Collectors.toMap(CourseType::getId, item -> item));
//        // 等于null，说明不存在，那么查询mysql，再存入redis
//        List<CourseType> treeData = treeData();
        // 3.遍历组装无线级树数据
        ArrayList<CourseType> treeData = new ArrayList<>();
        courseTypes.forEach(e -> {
            // 3.1.如果等于null或者等于0，那么说明是顶级，直接存入集合中
            if (e.getPid() == null || e.getPid().intValue() == 0) {
                treeData.add(e);
            } else {
                // 3.2.如果不是顶级，那么找到父亲，存入父亲中
                collect.get(e.getPid()).getChildren().add(e);
            }
        });
        //redisTemplate.opsForValue().set(CourseConstants.COURSE_TYPE_TREE, treeData);
        return treeData;
    }

    @Override
    @CacheEvict(cacheNames = CourseConstants.COURSE_TYPE_TREE, key = "'tree'")
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }

    @Override
    @CacheEvict(cacheNames = CourseConstants.COURSE_TYPE_TREE, key = "'tree'")
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }

    @Override
    @CacheEvict(cacheNames = CourseConstants.COURSE_TYPE_TREE, key = "'tree'")
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }

    @Override
    public List<CrumbsDto> crumbs(Long courseTypeId) {
        //根据courseTypeId查询一条数据
        CourseType courseType = selectById(courseTypeId);
        //判断
        AssertUtil.isNotNull(courseTypeId, GlobaEnums.PARAM_IS_NULL_ERROR);
        //从查询到得数据种拿到path
        String path = courseType.getPath();
        //对path数据进行截取
        String[] split = path.split("\\.");
        //new 一个控得集合来装截取到得数据
        ArrayList<CrumbsDto> list = new ArrayList<>();
        for (String s : split) {
            //创建对象来赋值
            CrumbsDto crumbsDto = new CrumbsDto();
            //创建对象来赋值
            CourseTypeDto courseTypeDto = new CourseTypeDto();
            //根据便利出来得数据来查询
            CourseType courseType2 = selectById(Long.valueOf(s));
            //赋值
            courseTypeDto.setId(courseType2.getId());
            //赋值
            courseTypeDto.setName(courseType2.getName());
            //将courseTypeDto中得数据再赋值到crumbsDto
            crumbsDto.setMe(courseTypeDto);

            List<CourseType> pid = courseTypeMapper.findByPid(courseType.getPid());
            for (CourseType type : pid) {
                //创建对象来赋值
                CourseTypeDto courseTypeDto1 = new CourseTypeDto();
                courseTypeDto1.setId(type.getId());
                courseTypeDto1.setName(type.getName());
                List<CourseTypeDto> others = crumbsDto.getOthers();
                others.add(courseTypeDto1);

            }
            list.add(crumbsDto);
        }
        return list;
    }

}
